home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / nrpas13.arc / RAN1.PAS < prev    next >
Pascal/Delphi Source File  |  1991-05-01  |  1KB  |  45 lines

  1. FUNCTION ran1(VAR idum: integer): real;
  2. (* Programs using RAN1 must declare the following variables
  3. VAR
  4.    glix1,glix2,glix3: integer;
  5.    glr: ARRAY [1..97] OF real;
  6. in the main program. *)
  7. CONST
  8.    m1=259200;
  9.    ia1=7141;
  10.    ic1=54773;
  11.    rm1=3.8580247e-6;   (* 1.0/m1 *)
  12.    m2=134456;
  13.    ia2=8121;
  14.    ic2=28411;
  15.    rm2=7.4373773e-6;   (* 1.0/m2 *)
  16.    m3=243000;
  17.    ia3=4561;
  18.    ic3=51349;
  19. VAR
  20.    j: integer;
  21. BEGIN
  22.    IF  (idum < 0)  THEN BEGIN
  23.       glix1 := (ic1-idum) MOD m1;
  24.       glix1 := (ia1*glix1+ic1) MOD m1;
  25.       glix2 := glix1 MOD m2;
  26.       glix1 := (ia1*glix1+ic1) MOD m1;
  27.       glix3 := glix1 MOD m3;
  28.       FOR j := 1 TO 97 DO BEGIN
  29.          glix1 := (ia1*glix1+ic1) MOD m1;
  30.          glix2 := (ia2*glix2+ic2) MOD m2;
  31.          glr[j] := (glix1+glix2*rm2)*rm1
  32.       END;
  33.       idum := 1
  34.    END;
  35.    glix1 := (ia1*glix1+ic1) MOD m1;
  36.    glix2 := (ia2*glix2+ic2) MOD m2;
  37.    glix3 := (ia3*glix3+ic3) MOD m3;
  38.    j := 1 + (97*glix3) DIV m3;
  39.    IF ((j > 97) OR (j < 1)) THEN BEGIN
  40.       writeln('pause in routine RAN1'); readln
  41.    END;
  42.    ran1 := glr[j];
  43.    glr[j] := (glix1+glix2*rm2)*rm1
  44. END;
  45.